package com.haixiaoke.saas.common.utils.tree;

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author qixi
 * @description 树形结构工具
 * @createTime 2023年10月23日16:32:54
 */
public class TreeUtil {

    /**
     * 生成树形结构
     *
     * @param list list集合需要继承ITree
     * @return {@link List}<{@link T}>
     */
    public static <ID, T extends ITree<ID>> List<T> generateTree(List<T> list) {
        Objects.requireNonNull(list, "参数不能为空");
        // 根据parentId分组
        Map<ID, List<ITree<ID>>> map = list.stream()
                .filter(item -> !item.firstLevel())
                .collect(Collectors.groupingBy(ITree::getParentId));
        // 给每一项设置子集，并排序
        list.forEach(item -> {
            List<ITree<ID>> children = map.get(item.getId());
            if (Objects.nonNull(children)) {
                item.setChildren(
                        children.stream()
                                .sorted(Comparator.comparing(ITree::getSort))
                                .collect(Collectors.toList())
                );
            }
        });
        // 过滤出所有的一级菜单，并排序
        return list.stream()
                .filter(ITree::firstLevel)
                .sorted(Comparator.comparing(ITree::getSort))
                .collect(Collectors.toList());
    }
}
